﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Web;

namespace OsManager.Models.odbc
{
    public class DataAccessHelper : IDisposable
    {
        ///<sumary>
        ///Objeto de factoring do sistema.
        ///</sumary
        private DbProviderFactory cnnFactory = null;

        ///<sumary>
        ///Objeto conexão do sistema.
        ///</sumary
        private DbConnection conexao = null;

        ///<sumary>
        ///Construtor da classe.
        ///</sumary
        ///<param name="abrirConexao">Se verdadeiro, abrea aconexão.</param>
        public DataAccessHelper(bool abrirConexao)
        {
            if (abrirConexao)
            {
                this.AbrirConexao();
            }
        }

        ///<sumary>
        ///Recupera a conexão que deverá ser executada.
        ///</sumary
        private string AmbienteAtivo
        {
            get
            {
                return ConfigurationManager.AppSettings["AMBIENTE_ATIVO"].ToString();
            }
        }

        ///<sumary>
        ///Abre a conexão com a base de dados.
        ///</sumary
        private void AbrirConexao()
        {

            if (this.conexao == null)
            {
                try
                {
                    this.cnnFactory = ConnectionFactory.CreateDatabaseObject(this.AmbienteAtivo);
                    this.conexao = this.cnnFactory.CreateConnection();
                    this.conexao.ConnectionString = ConnectionFactory.GetConnectionStringByName(this.AmbienteAtivo).ConnectionString;

                    this.conexao.Open();
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }

        ///<sumary>
        ///Fecha a conexão com a base de dados.
        ///</sumary
        private void FecharConexao()
        {
            try
            {
                if (this.conexao != null)
                {
                    if (this.conexao.State == ConnectionState.Open)
                    {
                        this.conexao.Close();
                        this.conexao.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }
        }

        ///<sumary>
        ///Método para buscar os dados.
        ///</sumary>
        ///<param name="comandoSql">O comando SQL para consultar os dados.</param>
        ///<returns>Retorna uma DataTable com o parâmetro de configuração do ambiente, chave do usuário e nome do formulário.</returns>
        public DataTable ObterDados(string comandoSql)
        {
            try
            {
                using (DbCommand selectComand = this.cnnFactory.CreateCommand())
                {
                    using (DbDataAdapter da = this.cnnFactory.CreateDataAdapter())
                    {
                        using (DataTable dt = new DataTable())
                        {
                            selectComand.CommandText = comandoSql;
                            selectComand.Connection = this.conexao;
                            da.SelectCommand = selectComand;
                            da.Fill(dt);

                            return dt;
                        }
                    }
                }
            }
            catch (System.Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }


        ///<sumary>
        ///Método para executar instruções de INSERT, UPDATE, DELETE nos dados.
        ///</sumary>
        ///<param name="comandoSql">O comando SQL a ser executado.</param>
        ///<returns>Número de linhas inseridas.</returns>
        public int Executar(string comandoSql)
        {
            int linhasInseridas = 0;

            try
            {
                using (DbCommand insertCommand = this.cnnFactory.CreateCommand())
                {
                    insertCommand.CommandText = comandoSql;
                    insertCommand.Connection = this.conexao;

                    linhasInseridas = insertCommand.ExecuteNonQuery();
                }

                return linhasInseridas;
            }
            catch (System.Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        ///<sumary>
        ///Verifica se a conexão está aberta.
        ///</sumary>
        public bool ConexaoAberta
        {
            get
            {
                if (this.conexao != null)
                {
                    return this.conexao.State == ConnectionState.Open;
                }
                else
                {
                    return false;
                }
            }
        }

        ///<sumary>
        ///Método para converter dados nulos vindo do banco para dados .NET.
        ///</sumary>
        ///<param name="val">Valor de entrada</param>
        ///<returns>Retorna o valor de saída para cada tipo de dados nulos.</returns>
        public object DBNullToNull(object val)
        {
            return Convert.IsDBNull(val) ? null : val;
        }

        ///<sumary>
        ///Fecha a conexão com o banco de dados.
        ///</sumary>
        public void Dispose()
        {
            this.FecharConexao();
        }

    }
}